import url from "url";
import methods from "methods";
import Layer from "./Layer.js";
import Route from "./route.js";
function Router() {
  this.stack = [];
}
methods.forEach((method) => {
  Router.prototype[method] = function (path, handlers) {
    // 调用类来管理路径
    let route = new Route();
    handlers.forEach((handler) => {
      route[method](handler);
    });
    let layer = new Layer(path, route.dispatch.bind(route));
    // 每个路由的层都有一个route属性，对应存放自己的真实路基的
    layer.route = route;
    this.stack.push(layer);
  };
});
Router.prototype.use = function (path, ...handlers) {
  if (typeof path === "function") {
    handlers = [path, ...handlers]; // path就是处理函数
    path = "/"; // 如果没写路径就是 / 匹配所有的路径
  }
  handlers.forEach((handler) => {
    const layer = new Layer(path, handler);
    layer.route = undefined; // 中间件没有路由这个对象
    this.stack.push(layer);
  });
};
Router.prototype.handle = function (req, res, out) {
  const { pathname, query } = url.parse(req.url, true);
  const method = req.method.toLowerCase();
  let idx = 0;
  let next = (err) => {
    if (this.stack.length == idx) return out();
    let layer = this.stack[idx++]; // 拿出第一个层
    if (err) {
      if (!layer.route) {
        // 有错误找中间件，而且 要找参数是4个的中间件
        if (layer.handler.length === 4) {
          layer.handler(err, req, res, next);
        } else {
          next(err); // 普通中间件继续带着错误向下走
        }
      } else {
        // 有错误但是是路由，要带着 错误继续往下走
        next(err);
      }
    } else {
      // 因为错误处理中间件定义在了 router.stack中 ,如果有err就去这个stack中查找错误处理中间件
      if (layer.match(pathname)) {
        if (layer.route) {
          // 路由
          if (layer.route.methods[req.method.toLowerCase()]) {
            // 需要匹配方法
            layer.handler(req, res, next); //  route.dispatch
          } else {
            next(); // 方法不一致直接向下走
          }
        } else {
          // 中间件无需匹配方法, 没有错误不能执行错误处理中间件
          if (layer.handler.length !== 4) {
            layer.handler(req, res, next); //  route.dispatch
          } else {
            next();
          }
        }
      } else {
        next();
      }
    }
  };

  next(); // 默认在路由中筛查
};

export default Router;
